为了账号安全,请及时绑定邮箱和手机立即绑定

Java反射机制~学习实例

标签:
Java
概念
  • 反射机制

反射是用来解刨Java的类、构造器(Constructor)、方法(Method)、属性(Field)等元素的信息。
反射是为了动态地加载一个类,动态调用一个方法,动态访问一个属性等要求而设计的,通过使用
java.lang.reflect下面的API。

  • Class

每一个Class类一种被加载进入JVM的类,代表该类的一种信息映射。通过下面三种方式可获取Class对象

1、Class类的forname()方法返回

2、访问所有类都会拥有的静态class属性

3、调用所有对象都会有的getClass方法

实现

ReflectClass.java


package com.pro.reflect;
/**
 * 反射实体类
 * @author GeekHou
 */
public class ReflectClass {
    protected String name;
    protected int age;
    public ReflectClass(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public ReflectClass() {
        super();
    }
    public void testMethod() {
        System.out.println("testMethord is called...");
    }
}
package com.pro.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ClassTest {

    public static void main(String[] args) {
        // 1 反射操作类的成员变量
        ReflectClass obj1 = new ReflectClass("张三",24);
        ReflectClass obj2 = new ReflectClass("李四",25);
        System.out.println("操作类的成员变量:"+compare(obj1, obj2).name+"年龄大一点");

        // 2 反射实例化类 ,需要实现默认构造函数
        String methodName = "testMethod";
        Class<ReflectClass> clazz = ReflectClass.class;// 获得class实例

        try {
            Method method = clazz.getMethod(methodName);// 获得指定方法名的Method对象
            if (method != null) {
                ReflectClass obj = clazz.newInstance();// 无参方式创建对象
                method.invoke(obj);// 调用obj指定的方法
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 3 反射实例化一个类
        try {
            Constructor<ReflectClass> reflectClass = clazz.getConstructor(String.class,int.class);
            ReflectClass reflectObj = reflectClass.newInstance("小子",21);
            System.out.println(reflectObj);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 操作类的成员变量
     * @param obj1
     * @param obj2
     * @return
     */
    private static ReflectClass compare(ReflectClass obj1,ReflectClass obj2) {
        // 两种方式获取一个Field对象
        try {
//          Field field = obj1.getClass().getDeclaredField("age");
            Field field = ReflectClass.class.getDeclaredField("age");
            // 访问私有成员
            // field.setAccessible(true);
            int age1 = (Integer)field.get(obj1);
            int age2 = (Integer)field.get(obj2);
            if (age1>age2) {
                return obj1;
            } else {
                return obj2;
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
延伸

Struts2 Hibernate Spring中均使用反射的机制实现,特别是Spring中的依赖注入反转控制、面向切面编程融入了反射的思想。

附上几个使用反射实例实现验证及Spring的链接
1、Java 简单校验框架
2、基于java反射的验证框架
3、非常好的Java反射例子
4、Spring反射机制
[ 作者csdn博客]

点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
15
获赞与收藏
190

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消